剑指offer---两个链表的第一个公共结点

115 篇文章 0 订阅
67 篇文章 1 订阅

题目描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
解题思路:
分别得到两个链表的长度num1和num2,然后计算出长度差len
先让较短的链表向前移动len,之后两个链表同时移动,当他们相等时,即为链表的第一个公共结点。

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2){
	if(pHead1==NULL||pHead2==NULL){
		return NULL;
	}
	int num1 = 0;//第一个链表的长度
	int num2 = 0;//第二个链表的长度
	int len = 0;//差值
	ListNode* p1 = pHead1;
	ListNode* p2 = pHead2;
	while(p1!=NULL){
		num1++;
		p1 = p1->next;
	}
	while(p2!=NULL){
		num2++;
		p2 = p2->next;
	}
	int i = 0;
	p1 = pHead1;
	p2 = pHead2;
	if(num1 > num2){
		len = num1-num2;
		while(i!=len){
			i++;
			p1 = p1->next;
		}
		while(p1 && p2){//循环判断链表1和链表2是否相等
            if(p1 == p2){
                break;
            }
			p1 = p1->next;
			p2 = p2->next; 
		}
		return p1;
	}else if(num1 < num2){
		len = num2-num1;
		while(i!=len){
			i++;
			p2 = p2->next;
		}
		while(p1&&p2){
            if(p1==p2){
                break;
            }
			p1 = p1->next;
			p2 = p2->next; 
		}
		return p2;
	}else{
        if(p1 == p2){//此时两个链表每一个结点都相等
            return p1;
        }else{//此时两个链表没有一个结点相等
            return NULL;
        }
    }
} 
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在6-3 链表,删除一个节点通常涉及到三个主要步骤:定位要删除的节点、修改前一个节点的针,以及释放被删除节点的内存。这里假设我们有一个单向链表,每个节点包含数据和向下一个节点的针。 1. **查找目标节点**:首先,你需要找到你要删除的节点。遍历链表,如果给定值等于当前节点的数据,或者你知道它的位置,则找到了目标。 2. **更新前驱节点**:如果找到了目标节点,检查它是否是第一个节点(头节点)。如果是,那么前一个节点为NULL,需要特殊处理,将头节点设置为第二个节点。如果不是,那么前一个节点的`next`向目标节点的下一个节点,使前一个节点的链路向目标的下一个节点,这样就完成了对目标节点的解除。 3. **释放节点内存**:对于非头节点,目标节点的内存可以直接释放,因为不再需要。但为了防止内存泄漏,一定要记得执行这个操作。如果是头节点,可能需要使用`free`或类似的方法释放。 下面是一个简单的伪代码示例: ```cpp void deleteNode(Node* &head, int value) { if (head == NULL) return; // 如果链表为空,直接返回 Node *prev = NULL, *current = head; while (current != NULL && current->data != value) { prev = current; current = current->next; } if (current == NULL) return; // 没找到目标节点,直接返回 if (prev == NULL) { // 删除头节点 head = current->next; free(current); } else { prev->next = current->next; free(current); // 释放目标节点 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值