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 }