输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
首先考虑将两个链表的第一个元素比较拿到新链表的头结点,作为新链表的头,然后将两个链表逐个比较取较小结点放在新链表的后面,直至有链表出现NULL。
学习单链表的时候写头插尾插头删尾删都可以顺利写出,没想到单链表的题目比较刁钻,这里走了不少弯路,先是新链表的头结点怎么获取有点糊涂,如果放在循环内将导致丢失指针,放在循环外的话,循环内的控制又有点糊涂。
struct ListNode* MerNode(struct ListNode* l1,struct ListNode* l2) { struct ListNode* n1=l1; struct ListNode* n2=l2; struct ListNode* head=NULL; if(n1==NULL) return n2; if(n2==NULL) return n1; if(n1->val<n2->val ) { head=n1; n1=n1->next;} else { head=n2; n2=n2->next;} struct ListNode* newhead=head;//新结点 while(n1 && n2)//采用&&是因为无论哪个结点出现NULL都要停止 { if(n1->val<n2->val) { head->next=n1; n1=n1->next; head=head->next; } else { head->next=n2; head=head->next; n2=n2->next; } } if(n1) { head->next=n1;//这里只需要一次,因为没有NULL的链表后面结点仍然是有效链接的,不然就需要while并控制循环继续插入 } if(n2) { head->next=n2; } return newhead; }
原文:https://www.cnblogs.com/shine365/p/14791502.html