目录
前沿:本系列有关链表系列的题,会持续更新,题目主要来自于leetcode和lintcode,有需要可以参考一波,语言用的C++,当然如果有需要java版的,可以评论区留言,或者私发博主。
leetcode21. 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:注意链表为空时的情况,当都不为空,使用迭代是一个比较快的解决方案
/**
* 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 == NULL&&l2 == NULL)
{
return NULL;
}
if (l1 == NULL)
{
return l2;
}
if (l2 == NULL)
{
return l1;
}
ListNode *head = NULL;
if (l1->val > l2->val)
{
head = l2;
head->next = mergeTwoLists(l1, l2->next);
}
else
{
head= l1;
head->next = mergeTwoLists(l1->next, l2);
}
return head;
}
};
lintcode452. 删除链表中的元素
删除链表中等于给定值val
的所有节点。
您在真实的面试中是否遇到过这个题? 是
样例
给出链表 1->2->3->3->4->5->3
, 和 val = 3
, 你需要返回删除3之后的链表:1->2->4->5
。
思路:lintcode头结点是从第一个节点算起,所以跟普通链表题 有点不一样。首先要判断链表是否为空,是的话直接返回,然后考虑到单链表的删除需要两个指针变量的配合作用,那么就要来定义两个变量
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: a ListNode
* @param val: An integer
* @return: a ListNode
*/
ListNode * removeElements(ListNode * head, int val) {
// write your code here
if(head==NULL)
return head;
ListNode *first=head,*second=head->next;
while(second!=NULL)
{
if (second->val==val)
{
first->next=second->next;
second=first->next; //链表往后走
}
else
{
first=first->next;
second=second->next;//链表往后走,注意两句的不同
}
}
if(head->val==val) head=head->next;
return head;
}
};
Lintcode 35.翻转链表
翻转一个链表
您在真实的面试中是否遇到过这个题? 是
样例
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
挑战
在原地一次翻转完成
思路:我们将表头摘下,从第一个节点开始,一次前插入头结点的后面,直到最后一个位置。时间复杂度O(1),。
LinkList Reverse(LinkList &L)
{
if (L == NULL)
{
return L;
}
else {
LNode *p = L->next,*last;
L->next = NULL;
while (p)
{
last = p->next;
p->next = L->next;
L->next = p;
p = last;
}
return L;
}
}