题目:给定两个都是升序的链表,要求编写函数来完成。最后返回合并之后的链表,要求合并之后的链表依然是升序的。
例如:1->3->6->6->null与1->2->5->null
合并和返回之后的链表:1->1->2->3->5->6->6->null
大家先动手完成。
//链表结构
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//合并两升序链表函数
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
}
分析:
写代码之前先分析一下代码该如何,那就要分析会有哪几种需要考虑的情况。
第一种情况:第一个链表为空链表,第二个链表不空,则直接返回第二个链表即可
第二种情况:第一个链表不空,第二个链表为空,则直接返回第一个链表
第三种情况:两个链表都为空,则直接返回空指针。但这种情况直接在第一和第二中情况中了,无需再一次去分析
第四种情况:两个链表都不空,这也是主要部分。
相信对于前面几种情况大家都是分分钟可以搞定的,现在就主要对最后一情况进行分析
方法一:迭代法
思想就是两链表中一一比较,谁小谁出,因为要求是升序返回
pre指针是取链表最小值 head指针作用是记住头结点
代码:
方法二:递归
情况依然是四种
递归的结束标志就是前三种中的其中一种出现
递归的思想就是两链表像比较,找出较小值,进行递归找该最小值指向的下一个最小值,一直递归下去。也就是首先比较链表1的第一个结点1和链表二的第一个结点2,取较小值1,递归找该值1下一个最小值,也就是比较 链表1的第二个结点3和链表二的第一个结点2,取较小值2,一直下去...