LeetCode刷题记录——21合并两个有序链表
一 题目描述:
-
将两个升序链表合并为一个新的升序链表并返回。新链表是通过凭借给定的两个链表的所有结点得到的。
-
示例:
-
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
-
二 思路:
定义两个指针,指向两个链表的元素,l1和l2
1)迭代:
-
步骤:
- 定义头节点
- 若l1指向的节点值<l2指向的节点值,则将l1链接到头节点的next位置,否则就将l2链接到头结点的next位置
- 循环进行,知道其中一个链表的长度变为NULL,或者其中一个指针的next为NULL
- 最后,将剩余的部分直接连接到尾部即可
-
代码:
ListNode* mergeTwoLists(ListNode* L1,ListNode* L2) { ListNode* head = new ListNode(1); ListNode* ret = head;//作为首节点返回 while (L1 != NULL && L2 != NULL) { if (L1->val < L2->val) { head->next = L1; L1 = L1->next; } else { head->next = L2; L2 = L2->next; } head = head->next; } head->next = L1 == NULL ? L2 : L1; //free(head);//加了这个,没有通过 return ret->next; }
2)递归:
编写递归的第一步是先明确函数需要完成的功能,以及函数跳出结束的条件,因为递归本就不好理解,所以在写函数之前,要明确跳出的条件,以及返回值的位置
-
函数功能:
- 返回l1指向的节点和l2指向的节点中,值较小的节点
- 返回从下级函数获得的返回值,链接到当前节点的尾部
-
函数结束的条件:
- 当l1或者l2为空时
- 返回l1和l2中剩余的部分
-
代码:
-
ListNode* mergeTwoLists(ListNode* L1,ListNode* L2) { if (L1 == NULL) return L2; if (L2 == NULL) return L1; //妙啊! if (L1->val > L2->val) { L2->next = mergeTwoLists(L1,L2->next); return L2; } L1->next = mergeTwoLists(L1->next, L2); return L1; }
-