21. 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
 
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
 
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 
 
 
比较 L1 和L2 指向的节点,将较小的节点插入到 ptr 指针后,并向前移动较小节点对应的指针
 
 
最终结果
 
 1 struct ListNode {
 2     int val;
 3     ListNode *next;
 4     ListNode(int x) : val(x), next(NULL) {}
 5 };
 6 
 7 class Solution {
 8 public:
 9     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
10         ListNode temp_head(0);//都连接到临时头节点后面
11         ListNode *ptr = &temp_head;
12         
13         while (l1 && l2) {
14             if (l1->val < l2->val) {//小的开始连接
15                 ptr->next = l1;
16                 l1 = l1->next;
17             } else {
18                 ptr->next = l2;
19                 l2 = l2->next;
20             }
21             ptr = ptr->next;
22         }
23         if (l1) { //如果其中一个有剩余,l1不小于l2 或者 l2不小于l1
24             ptr->next = l1;
25         }
26         if (l2) {
27             ptr->next = l2;
28         }
29         return temp_head.next;//临时节点的下一个节点
30     }
31 };

 

测试
 1 int main(int argc, const char * argv[]) {
 2     ListNode a(1);
 3     ListNode b(2);
 4     ListNode c(3);
 5     ListNode d(4);
 6     ListNode e(5);
 7     ListNode f(7);
 8     a.next = &b;
 9     b.next = &c;
10     d.next = &e;
11     e.next = &f;
12     
13     Solution solve;
14     ListNode *head = solve.mergeTwoLists(&a, &d);
15     while (head) {
16         cout <<head->val <<endl;
17         head = head->next;
18     }
19 
20     return 0;
21 }
View Code

 

posted @ 2019-11-09 15:37  0x8023  阅读(115)  评论(0编辑  收藏  举报