数据结链表系列(详细解析)

版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/Charles_ke,转载请申明来源,谢谢配合 https://blog.csdn.net/Charles_ke/article/details/81198051

目录

1.leetcode21. 合并两个有序链表

2.lintcode452. 删除链表中的元素

3.Lintcode 35.翻转链表


 

 


前沿:本系列有关链表系列的题,会持续更新,题目主要来自于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;
	}
	



	
}

 

 

阅读更多

扫码向博主提问

Charles_ke

坚持不懈漫漫程序路
  • 擅长领域:
  • java2e
  • 算法
  • c#
  • lintcode
去开通我的Chat快问
换一批

没有更多推荐了,返回首页