21.Merge Two Sorted Lists
我的思路:
显然这条题目里所说的已经排好序,是基于这么一个假设:两个list都是按值从小到大排序的。没有出现我们之前C++作业那种,有3种可能:
- 两个都是从小到大排序
- 两个都是从大到小排序
- 一个是从小到大排序,另一个是从大到小排序
我已经不记得当时要求返回值的顺序是什么样子了。
我先假设是要求从小到大排序。那么从作业转换到这条题目,只需要将从大到小排序的list转换成从小到大的就行。也就是这里需要一个reverse函数。
再假设按照第1个list的顺序拼接,那么也好办,先找出第1个list的排序方案,然后按照之前假设的从小到大排序返回的做法做,只需要在最后那里加上按第1个list排序,也就是看情况调用或者不调用reverse函数。
对于这条题目,我用的是非递归的做法,在做的过程中,需要注意的一个点是,这里没有办法申请一个空的节点,所以需要申请一个头结点作为辅助。另外,为了返回值,需要一个辅助指针。只能说,手撕链表还是很难受的,STL很好用。
我的代码:
丑,请轻喷
/**
* 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* result = new ListNode(0);
ListNode* helper = result;
while(l1 && l2) {
if(l1->val < l2->val) {
helper->next = l1;
l1 = l1->next;
} else {
helper->next = l2;
l2 = l2->next;
}
helper = helper->next;
}
helper->next = l1 ? l1 : l2;
return result->next;
}
};