目录
合并两个排序的链表
这个题是属于比较简单的,代码自然而然的也会简洁很多,这个题可以考虑创建一个新链表,再利用双指针,来比较哪个小来进行尾插,不过这里要注意第一个位置需要单独进行头插,或者建立一个带哨兵的链表来一直尾插,
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
struct ListNode* head = NULL,*tail = NULL;//创建头变量和尾变量方便头插尾插
//带哨兵的链表,方便尾插
//tail = head = (int*)malloc(sizeof(struct ListNode));
if((l1->val)>(l2->val))
{
head = l2;
tail = l2;
l2 = l2->next;
}
else
{
head = l1;
tail = l1;
l1 = l1->next;
}
while(l1 && l2)
{
//取小尾插
if((l1->val)>(l2->val))
{
tail->next = l2;
tail = l2;
l2 = l2->next;
}
else
{
tail->next = l1;
tail = l1;
l1 = l1->next;
}
}
if(l1 == NULL)
{
tail->next = l2;
}
else{
tail->next = l1;
}
//realhead = head ->next
//带哨兵的返回要为 return realhead
return head;
}
链表中倒数第k个结点
这个题目也很简单,这里就可以引用快慢指针来进行操作定义一个快指针fast,定义一个慢指针slow快指针要比慢指针多走k步,这样子返回慢指针就达到要求了
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
struct ListNode* slow = head,*fast = head;
while(k--)
{
//如果k大于链表长度
if(fast)
fast = fast->next;
else
return NULL;
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}