`链表简单算法题
1.将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成。(附leetcode 21.)
//方法一
struct ListNode *mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(!l1)
return l2;
if(!l2)
return l1;
struct ListNode *head=(struct ListNode*)malloc(sizeof(struct ListNode)),*t=head;
while(l1&&l2){
if(l1->val<l2->val){
t->next=l1;
l1=l1->next;
}
else
{
t->next=l2;
l2=l2->next;
}
t->next;
}
if(l1)
t->next=l1;
else if(l2)
t->next=l2;
return head->next;
}
//方法二:
//终止条件:当链表中有一个链表为NULL,则直接返回另外一个链表。
//递归方法:判断l1,l2头节点的大小,然后将较小的next指向其余节点的合并结果。
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if (l1 == NULL)
{
return l2;
}
if (l2 == NULL)
{
return l1;
}
if(l1->val <= l2->val)
{
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else
{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
2.给定一个头结点为 head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。(附leetcode 876)
//快慢指针
//思路:设立两个指针,一个一次走两步,一个一次走一步,当走两步的走到终点的时候,那个走一步的刚好走到中点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *fast = head;
struct ListNode *slow = head;
while( (fast) && (fast->next)){
slow = slow -> next;
fast = fast -> next -> next;
}
return slow;
}
3.反转一个链表(附leetcode 206)
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
//方法一:迭代,双指针法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rever