面试题25:合并两个排序的链表(C++)
题目地址:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/
题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
题目示例
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路
双指针(迭代):我们将链表l1和l2合并后生成的新链表头节点设置为哑节点p,然后将l1和l2的节点比较大小,按照从小到大的顺序依次添加到哑节点p之后,如果l1的值val小于等于l2的val值,则将l1的val值追加到p之后,否则将l2的val值追加到p之和,从而构成新链表,最后合并链表尾部,如果链表l1不为空,则p继续指向l1,否则p指向链表l2剩余部分。因为合并后的链表的第一个节点是在p之和,所以返回q->next。
递归:递归调用函数,按照单调递增顺序依次返回。
程序源码
方法1:双指针/迭代
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* p = new ListNode(-1); ListNode* q = p; if(l1 == nullptr) return l2; if(l2 == nullptr) return l1; while(l1 !=nullptr && l2 != nullptr) { if(l1->val <= l2->val) { p->next = l1; l1 = l1->next; } else { p->next = l2; l2 = l2->next; } p = p->next; } if(l1 != nullptr) { p->next = l1; } if(l2 != nullptr) { p->next = l2; } return q->next; } };
方法2:递归
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1 == nullptr) return l2; if(l2 == nullptr) return l1; ListNode* p; if(l1->val < l2->val) { p = l1; p->next = mergeTwoLists(l1->next, l2); } else { p = l2; p->next = mergeTwoLists(l1, l2->next); } return p; } };
-----------------------------------
心之所向,素履所往;生如逆旅,一苇以航。
------------------------------------------